//
// Created by Yun on 2025/2/19.
//

#ifndef FRAMEWORK_BSP_UART_H
#define FRAMEWORK_BSP_UART_H

#include "bsp_common_type.h"
#include "bsp_gpio.h"
#include "uart_slow_interface.h"


/* 串口配置结构体 */
typedef struct Uart_Hw_Cfg {
    // 串口相关配置
    UART_HandleTypeDef      stHUart;
    Gpio_Hw_Cfg_TypeDef     stTx ;
    Gpio_Hw_Cfg_TypeDef     stRx;

    // 中断相关配置
    uint8_t u8ITPriority;
    uint8_t u8ITSubPriority;

    // 发送临时变量
    uint16_t u16Temp;
    // 字节超时时间
    uint16_t u16Timeout;
    uint16_t u16Retry;

    /* 接收发送缓存区 */
    struct{
        uint8_t* u8Buffer;
        uint16_t u16BufferSize;
        uint16_t u16Len;
    }stRxBuffer,stTxBuffer;

    pfNVIC_Callback_TypeDef pfRxFinishedCallback;
    pfNVIC_Callback_TypeDef pfTxFinishedCallback;

}Uart_Hw_Cfg_TypeDef;


/*!
 * @brief 串口初始化
 * @param pUartHwCfg : 串口配置结构体
 * @param u8RxBuffer : 接收缓存区指针
 * @param u16RxBufferSize : 接收缓存区大小
 * @param u8TxBuffer : 发送缓存区指针
 * @param u16TxBufferSize : 发送缓存区大小
 * @param pfRxFinishedCallback : 接收完成回调函数
 * @param pfTxFinishedCallback : 发送完成回调函数
 * @param uint16Timeout : 字节超时时间
 * @return BSP_OK:初始化成功; BSP_ERROR:初始化失败
 */
uint8_t Bsp_Uart_Init(const void* pUartHwCfg,
                      uint8_t* u8RxBuffer,
                      uint16_t u16RxBufferSize,
                      uint8_t* u8TxBuffer,
                      uint16_t u16TxBufferSize,
                      pfNVIC_Callback_TypeDef pfRxFinishedCallback,
                      pfNVIC_Callback_TypeDef pfTxFinishedCallback,
                      uint8_t uint16Timeout);
/*!
 * @brief 串口发送数据
 * @param pUartHwCfg : 串口配置结构体
 * @param pu8TxData : 待发送数据指针
 * @param u16Len : 待发送数据长度
 * @return BSP_OK:初始化成功; BSP_ERROR:初始化失败
 */
uint8_t Bsp_Uart_Transmit(const void* pUartHwCfg, uint8_t* pu8TxData, uint16_t u16Len);

/*!
 * @brief 串口接收数据
 * @param pUartHwCfg : 串口配置结构体
 * @param pu8RxData : 接收数据指针
 * @param pu16Len  : 接收数据长度指针
 * @return BSP_OK:初始化成功; BSP_ERROR:初始化失败
 */
uint8_t Bsp_Uart_Receive(const void* pUartHwCfg, uint8_t* pu8RxData, uint16_t* pu16Len);

uint8_t Bsp_Uart_SetBaudrate(const void* pUartHwCfg, uint32_t u32Baudrate);

/* UART接口 */
extern Uart_Slow_Interface_TypeDef stBspUartInterface;

#endif //FRAMEWORK_BSP_UART_H
